package com.saydc.actions.evaluaciones;

import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.saydc.beans.Usuario;
import com.saydc.dao.EvaluacionesDAO;
import com.saydc.forms.evaluaciones.EvaluacionForm;
import com.saydc.model.CalificacionItemEvaluacion;
import com.saydc.model.Capacitacion;
import com.saydc.model.Empleado;
import com.saydc.model.EvaluacionEmpleado;
import com.saydc.model.ItemEvaluacion;
import com.saydc.model.ResultadoEvaluacion;

public class GuardarEvaluacionAction extends Action {
	
	private static int VALOR_NO_APLICABLE = 6;
	private static int VALOR_FALLIDO = 1;
	
	@SuppressWarnings("unchecked")
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		EvaluacionEmpleado evaluacion = new EvaluacionEmpleado();
		
		Map<ItemEvaluacion, CalificacionItemEvaluacion> mapaCalificaciones = new HashMap<ItemEvaluacion, CalificacionItemEvaluacion>();
		
		Empleado empleado = (Empleado)request.getSession().getAttribute("empleado");
		Usuario evaluador = (Usuario)request.getSession().getAttribute("usuarioLogueado");
		
		evaluacion.setEmpleado(empleado);
		evaluacion.setPuesto(empleado.getPuestoActual());
		evaluacion.setFechaEvaluacion(new Date());
		evaluacion.setEvaluador(evaluador);
		
		List<CalificacionItemEvaluacion> listaCalificaciones = (List<CalificacionItemEvaluacion>)request.getSession().getAttribute("calificaciones");
		List<ItemEvaluacion> itemsDescripcion = (List<ItemEvaluacion>)request.getSession().getAttribute("itemsEvaluacion");
		
		EvaluacionForm evalForm = (EvaluacionForm)form;
		int[] itemsCalificacion = evalForm.getItemsEvaluaciones();
		Set<Capacitacion> capacRecomendadas = new HashSet();
		double sumatoria = 0d;
		int valor;
		int cantPuntuables = 0;
		for(int i=0; i<itemsDescripcion.size(); i++){
			CalificacionItemEvaluacion calificacion = listaCalificaciones.get(itemsCalificacion[i]-1); 
			ItemEvaluacion item = itemsDescripcion.get(i);
			mapaCalificaciones.put(item, calificacion);
			valor = calificacion.getValor();
			if(valor != VALOR_NO_APLICABLE){
				cantPuntuables++;
				sumatoria += valor;
			}
			if(valor == VALOR_FALLIDO){
				capacRecomendadas.add(item.getCapacitacion());
			}
			
		}
		evaluacion.setCalificaciones(mapaCalificaciones);
		
		empleado.agregarCapacitaciones(capacRecomendadas);
		
		ResultadoEvaluacion resultado = new ResultadoEvaluacion();
		resultado.setValor(sumatoria/((new Integer(cantPuntuables)).doubleValue()));
		resultado.setComentario(evalForm.getComentario());
		resultado.setCapacRecomendadas(capacRecomendadas);
		
		evaluacion.setResultado(resultado);
		
		EvaluacionesDAO dao = EvaluacionesDAO.getInstance();
		dao.guardarEvaluacion(evaluacion);
		
		request.getSession().setAttribute("evaluacion", evaluacion);
		request.getSession().setAttribute("resultado", resultado);

		return mapping.findForward("success");
	}

}
